#ifndef CMDUTIL_H
#define CMDUTIL_H

#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QMessageBox>
#include <QRegularExpressionMatchIterator>
#include <QString>

class CmdUtil{
    public:
        static void parseCommandLineWithSpaceAndParam(const QString &commandLine, QString &programPath, QStringList &arguments) {
            // 使用正则表达式匹配引号内的部分（路径）和引号外的部分（参数）
            QRegularExpression re("\"([^\"]+)\"|(\\S+)");
            QRegularExpressionMatchIterator it = re.globalMatch(commandLine);

            bool isFirst = true;
            while (it.hasNext()) {
                QRegularExpressionMatch match = it.next();
                if (match.captured(1).length() > 0) {
                    // 匹配到引号内的部分（路径）
                    if (isFirst) {
                        programPath = match.captured(1);
                        isFirst = false;
                    } else {
                        arguments << match.captured(1);
                    }
                } else if (match.captured(2).length() > 0) {
                    // 匹配到引号外的部分（参数）
                    arguments << match.captured(2);
                }
            }
        }

        static QString checkPath(const QString &path) {
            QFileInfo fileInfo(path);

            if (fileInfo.exists()) {
                if (fileInfo.isFile() || fileInfo.isDir()) {
                    return path;
                }
            }

            return "-1";
        }


        static QString parseCommandAtSymbolWithPath(const QString &path, QString &programPath, QStringList &arguments)
        {
            // 获取当前程序的路径
            QString currentPath = QCoreApplication::applicationDirPath();

            // 检查路径中是否包含"@"符号
            if (path.contains("@")) {
                // 替换"@"符号为当前程序的路径
                QString newPath = path;
                newPath.replace("@.", currentPath).replace("\\","/");
                int exePos = newPath.indexOf(".exe");
                programPath = newPath.left(exePos+4);
                QString argumentStr = newPath.right(newPath.length() - exePos-5);
                arguments = argumentStr.split(" ");
                if("-1" == checkPath(programPath)){
                    QMessageBox::information(NULL, "入参检查", QString("输入参数不正确: %1").arg(newPath));
                }
                return newPath;
            } else {
                // 如果路径中没有"@"符号，则返回原路径
                return path;
            }
        }
        static QString parsePathWithSpace(const QString &path)
        {
            QString str = path;
            // QString path = "C:\\Program Files\\ToDesk\\ToDesk.exe";
            QString strpath = str.replace("\\","/");
            if(strpath.contains(" "))
            {
                str = QString("\"%1\"").arg(strpath);
            }
            else
            {
                str = strpath;
            }

            return str;
        }

        // 获取可执行文件路径
        static QString getExecutableInSysPath(const QString& input) {
            QStringList systemPaths = {
                "C:\\Windows\\System32\\",
                "C:\\Windows\\SysWOW64\\"
            };

            QString fileName = input;
            if (!fileName.endsWith(".exe")) {
                fileName += ".exe";
            }

            foreach (const QString& path, systemPaths) {
                QString fullPath = path + fileName;
                if (QFile::exists(fullPath)) {
                    return QDir::toNativeSeparators(fullPath);
                }
            }

            return QString(); // 文件不存在
        }
        // 获取可执行文件路径
        static QString getExecutablePath(const QString& input) {
            int exePos = input.lastIndexOf(".exe");
            QStringList systemPaths = {
                "C:\\Windows\\System32\\",
                "C:\\Windows\\SysWOW64\\"
            };
            if (exePos == -1) {
                // QString sysPath = getExecutableInSysPath(input);//在系统路径下寻找是否存在
                // return sysPath; // 没有找到.exe
                return input;
            }

            QString path = input.left(exePos + 4); // 包含.exe
            if (QFile::exists(path)) {
                return path;
            } else {
                return input; // 路径无效
            }
        }

        // 获取参数列表
        static QStringList getParameters(const QString& input) {
            int exePos = input.lastIndexOf(".exe");
            if (exePos == -1) {
                return QStringList(); // 没有找到.exe
            }

            QString paramsPart = input.mid(exePos + 4).trimmed();
            QStringList parameters = paramsPart.split(QRegExp("\\s+"), Qt::SkipEmptyParts);

            return parameters;
        }
};


#endif // CMDUTIL_H
